/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * GestionObraSocialPresentacion.java
 *
 * Created on 24-jul-2010, 11:04:10
 */

package presentacion.obra_social;

import hibernate.objeto.ObraSocial;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JOptionPane;
import logica.ObraSocialLogica;
import presentacion.utilidad.tabla.MiModeloTabla;
import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;
import logica.CapaLogica;
import logica.validacion.ObraSocialValidacion;
import presentacion.CapaPresentacion;
import presentacion.utilidad.maquetado.Fuente;
import presentacion.utilidad.maquetado.Icono;
import presentacion.utilidad.BarMenu;
import presentacion.utilidad.PopUpMenu;
import presentacion.utilidad.MensajePresentacion;
import presentacion.utilidad.Paginador;

/**
 *
 * @author Administrador
 */
public class GestionObraSocialPresentacion extends javax.swing.JDialog {

    /** Creates new form GestionObraSocialPresentacion.
     *
     * @param seleccion true si es ventana de selección, false si es para gestión
     * @param parent
     * @param modal
     * @param unaSesion
     */
    public GestionObraSocialPresentacion(java.awt.Frame parent, boolean modal,
            boolean esGuiVisualizacion) {
        super(parent, modal);
        
        this.esGuiVisualizacion = esGuiVisualizacion;
        obraSocialSeleccionada = null;

        initComponents();
        setSize(CapaPresentacion.getTamañoMaximoJDialog());
        setLocationRelativeTo(null);
        setearEventosQueCapturanTeclaEnterYEscape();
        personalizarGUI();
    }

    /**
     * Setea datos de la ventana.
     * 
     */
    private void personalizarGUI() {
        //Crea la barra de menu
        this.setJMenuBar(BarMenu.createMenuBarGestionObraSocial(this));

        iniciarPaginador();
        cargarTablaObraSocial();

        filtrar.requestFocus();
    }
    
    private void cargarTablaObraSocial() {
        //Si corresponde vuelve a cero el indice del paginador, de lo contrario
        //Lo deja en el valor que se encuentra
        Paginador.actualizaIndice(0);
        //Actualiza la tabla
        MiModeloTabla.cargarTablaObraSocial(
                ObraSocialLogica.getVectorObraSocialEnBd(), tablaObraSocial);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        textoDescriptivoVentana = new javax.swing.JLabel();
        botonAgregarObraSocial = new javax.swing.JButton();
        textoFiltrar = new javax.swing.JLabel();
        filtrar = new javax.swing.JTextField();
        tablaObraSocialScrollPanel = new javax.swing.JScrollPane();
        tablaObraSocial = new javax.swing.JTable(new MiModeloTabla());
        paginadorUno = new javax.swing.JPanel();
        botonAnteriorPaginadorUno = new javax.swing.JButton();
        botonSiguientePaginadorUno = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Gestión Obra Social");
        setMinimumSize(new java.awt.Dimension(458, 341));

        textoDescriptivoVentana.setFont(Fuente.FUENTE_TITULO_2);
        textoDescriptivoVentana.setForeground(Fuente.COLOR_NORMAL);
        textoDescriptivoVentana.setText("Seleccione la Obra Social de la lista. Si no existe, puede agregarla");
        textoDescriptivoVentana.setPreferredSize(new java.awt.Dimension(422, 20));

        botonAgregarObraSocial.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonAgregarObraSocial.setForeground(Fuente.COLOR_NORMAL);
        botonAgregarObraSocial.setIcon(Icono.ICONO_16_AGREGAR);
        botonAgregarObraSocial.setText("Agregar obra social");
        botonAgregarObraSocial.setToolTipText("Agregar una nueva obra social");
        botonAgregarObraSocial.setPreferredSize(new java.awt.Dimension(175, 23));
        botonAgregarObraSocial.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAgregarObraSocialActionPerformed(evt);
            }
        });

        textoFiltrar.setFont(Fuente.FUENTE_LABEL);
        textoFiltrar.setForeground(Fuente.COLOR_NORMAL);
        textoFiltrar.setText("Filtrar");

        filtrar.setFont(Fuente.FUENTE_TEXTFIELD);
        filtrar.setForeground(Fuente.COLOR_NORMAL);
        filtrar.setToolTipText("Filtra los datos encontrados por algún criterio");
        filtrar.setPreferredSize(new java.awt.Dimension(200, 20));
        filtrar.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                filtrarKeyReleased(evt);
            }
        });

        tablaObraSocialScrollPanel.setToolTipText("Doble click para seleccionar. Click derecho para más opciones");
        tablaObraSocialScrollPanel.setPreferredSize(new java.awt.Dimension(422, 218));

        tablaObraSocial.setToolTipText("Click derecho para más opciones");
        tablaObraSocial.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaObraSocialMouseClicked(evt);
            }
        });
        tablaObraSocialScrollPanel.setViewportView(tablaObraSocial);
        MiModeloTabla.inicializarTabla(tablaObraSocial);

        paginadorUno.setMaximumSize(new java.awt.Dimension(700, 14));

        botonAnteriorPaginadorUno.setFont(new java.awt.Font("Tahoma", 0, 10));
        botonAnteriorPaginadorUno.setIcon(Icono.ICONO_16_ANTERIOR);
        botonAnteriorPaginadorUno.setPreferredSize(new java.awt.Dimension(43, 23));
        botonAnteriorPaginadorUno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAnteriorPaginadorUnoActionPerformed(evt);
            }
        });

        botonSiguientePaginadorUno.setFont(new java.awt.Font("Tahoma", 0, 10));
        botonSiguientePaginadorUno.setIcon(Icono.ICONO_16_SIGUIENTE);
        botonSiguientePaginadorUno.setPreferredSize(new java.awt.Dimension(43, 23));
        botonSiguientePaginadorUno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSiguientePaginadorUnoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout paginadorUnoLayout = new javax.swing.GroupLayout(paginadorUno);
        paginadorUno.setLayout(paginadorUnoLayout);
        paginadorUnoLayout.setHorizontalGroup(
            paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paginadorUnoLayout.createSequentialGroup()
                .addComponent(botonAnteriorPaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(botonSiguientePaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        paginadorUnoLayout.setVerticalGroup(
            paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(paginadorUnoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(botonAnteriorPaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(botonSiguientePaginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(tablaObraSocialScrollPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 1004, Short.MAX_VALUE)
                    .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(botonAgregarObraSocial, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 597, Short.MAX_VALUE)
                        .addComponent(textoFiltrar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(filtrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(paginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(filtrar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textoFiltrar)
                    .addComponent(botonAgregarObraSocial, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tablaObraSocialScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 604, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(paginadorUno, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * Agrega una nueva Obra Social al sistema.
     *
     * @param evt
     */
    private void botonAgregarObraSocialActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAgregarObraSocialActionPerformed
        //Reinicia paginador
        Paginador.paginarElemento[0] = false;
        agregarObraSocial();
    }//GEN-LAST:event_botonAgregarObraSocialActionPerformed

    /**
     * Setea la obra seleccionada para ser recuperada en la ventana de paciente.
     * 
     * @param evt
     */
    public boolean seleccionarObraSocial() {
        if (!esGuiVisualizacion) {
            //Completa info para devolver a la ventana anterior
            obraSocialSeleccionada = (ObraSocial) 
                    MiModeloTabla.recuperarObjetoDeTabla(
                    ObraSocial.class.getName(), tablaObraSocial);

            if (obraSocialSeleccionada != null) {
                this.dispose();
            }
        }

        return false;
    }
    
    /**
     * Agrega una obra social al sistema.
     *
     * @return true si se agregó correctamente, false en caso contrario
     */
    public boolean agregarObraSocial(){
        if (CapaPresentacion.modoCarga) {
            String nombreObraSocial = MensajePresentacion.ingresoCadenaDeTexto(
                    "Ingrese la razón social", "", null);

            if (nombreObraSocial != null) {

                //Valida
                if (ObraSocialValidacion.validarDetalleObraSocial(
                        nombreObraSocial, true)) {
                    //Si no existe en la bd
                    if (!ObraSocialLogica.existeObraSocialPorNombreYPorEnBd(
                            nombreObraSocial, true)) {
                        int[] idObjetoCreado = new int[1];

                        if (ObraSocialLogica.agregarOModificarObraSocial(
                                nombreObraSocial, null, idObjetoCreado)) {

                            obraSocialSeleccionada =
                                        ObraSocialLogica.getObraSocialPorId(
                                        idObjetoCreado[0]);

                            if (obraSocialSeleccionada != null && !esGuiVisualizacion) {
                                //En modo selección se selecciona
                                this.dispose();
                            } else {
                                //Sino se muestra en la tabla
                                cargarTablaObraSocial();
                                //Selecciona la Obra Social recién agregada
                                while(!MiModeloTabla.seleccionarFilaDeTabla(
                                        String.valueOf(ObraSocialLogica.
                                        getObraSocialPorNombreYPorEnBd(
                                        nombreObraSocial, true).getIdObraSocial()),
                                        tablaObraSocial, tablaObraSocialScrollPanel)) {
                                    paginarAdelanteTablaObraSocial();
                                }
                            }

                            return true;
                        } else {
                            return false;
                        }
                    } else {
                        MensajePresentacion.errorDuplicidadObjeto("La obra social");
                        agregarObraSocial();
                    }
                } else {
                    MensajePresentacion.errorDatoInvalido();
                    agregarObraSocial();
                }
            }
        } else {
            MensajePresentacion.informarUsuarioRestringido();
        }
        
        return false;
    }

    /**
     * Modifica la obra social seleccionada de la tabla.
     *
     * @return true si se modificó correctamente, false en caso contrario
     */
    public boolean modificarObraSocial() {
        if (CapaPresentacion.modoModificacion) {
            ObraSocial obraSocial = (ObraSocial) MiModeloTabla.recuperarObjetoDeTabla(
                ObraSocial.class.getName(), tablaObraSocial);
            //Si hay alguna fila seleccioanada
            if (obraSocial != null) {
                String textoIngresado = MensajePresentacion.ingresoCadenaDeTexto(
                    "Ingrese la razón social",
                    obraSocial.getDetalleObraSocial(), null);

                //Si se ingresa un nuevo nombre
                if (textoIngresado != null) {

                    //Valida el texto ingresado
                    if (ObraSocialValidacion.validarDetalleObraSocial(textoIngresado, true)) {
                        //Confirmar modificación
                        if (CapaPresentacion.confirmarModificacion("obra social", "la")) {
                            if (ObraSocialLogica.agregarOModificarObraSocial(
                                    textoIngresado, obraSocial, new int[1])) {
                                //Actualiza la tabla
                                MiModeloTabla.cargarTablaObraSocial(ObraSocialLogica.
                                        getVectorObraSocialEnBd(), tablaObraSocial);
                                //Selecciona la Obra Social recién modificada
                                while(!MiModeloTabla.seleccionarFilaDeTabla(
                                        String.valueOf(obraSocial.getIdObraSocial()),
                                        tablaObraSocial, tablaObraSocialScrollPanel)) {
                                    paginarAdelanteTablaObraSocial();
                                    return true;
                                }
                            }
                        } else {
                            return false;
                        }
                    } else {
                        MensajePresentacion.errorDatoInvalido();
                        modificarObraSocial();
                    }
                }
            }
        } else {
            MensajePresentacion.informarUsuarioRestringido();
        }

        return false;
    }

    /**
     * Elimina la obra social seleccionada de la tabla.
     *
     */
    public boolean eliminarObraSocial() {
        if (CapaPresentacion.modoCarga || CapaPresentacion.modoModificacion) {
            ObraSocial obraSocial = (ObraSocial) MiModeloTabla.
                    recuperarObjetoDeTabla(
                    ObraSocial.class.getName(), tablaObraSocial);
            boolean operacion = false;

            //Si hay alguna fila seleccioanda
            if (obraSocial != null) {
                if (obraSocial.getPacientes().isEmpty()) {
                    int confirmado = MensajePresentacion.
                            confimarEliminacionObjeto("obra social", "la");

                    if (JOptionPane.OK_OPTION == confirmado) {
                        operacion = ObraSocialLogica.eliminarObraSocial(
                                obraSocial);
                    }
                    //Actualiza la tabla
                    MiModeloTabla.cargarTablaObraSocial(
                            ObraSocialLogica.getVectorObraSocialEnBd(), tablaObraSocial);
                    return operacion;
                } else {
                    //Si posee pacientes se reporta y el usuario decide
                    int confirmado = MensajePresentacion.
                            confirmarEliminacionObraSocialConPacientes();
                    if (JOptionPane.OK_OPTION == confirmado) {
                        ObraSocialLogica.quitarAsociacionConPacientes(obraSocial);
                        operacion = ObraSocialLogica.eliminarObraSocial(
                                obraSocial);
                    }
                    //Actualiza la tabla
                    MiModeloTabla.cargarTablaObraSocial(ObraSocialLogica.
                            getVectorObraSocialEnBd(), tablaObraSocial);
                    return operacion;
                }
            }
        } else {
            MensajePresentacion.informarUsuarioRestringido();
        }
        
        return false;
    }

    private void filtrarKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_filtrarKeyReleased
        TableRowSorter<MiModeloTabla> sorter =
                new TableRowSorter<MiModeloTabla>(
                (MiModeloTabla) tablaObraSocial.getModel());
        tablaObraSocial.setRowSorter(sorter);

        String texto = filtrar.getText();
        if (texto.length() == 0) {
            sorter.setRowFilter(null);
        } else {
            sorter.setRowFilter(RowFilter.regexFilter("(?i).*" + texto + ".*"));
        }
    }//GEN-LAST:event_filtrarKeyReleased

    private void tablaObraSocialMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaObraSocialMouseClicked
        //Selecciona con doble click
        if (!esGuiVisualizacion && evt.getClickCount() == 2 && evt.getButton() == 1) {
            seleccionarObraSocial();
        } else {
        //Despliega pop-up
        PopUpMenu.crearPopupMenuObraSocial(tablaObraSocial, this);
        }
    }//GEN-LAST:event_tablaObraSocialMouseClicked

    private void botonAnteriorPaginadorUnoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAnteriorPaginadorUnoActionPerformed
        paginarAtrasTablaObraSocial();
}//GEN-LAST:event_botonAnteriorPaginadorUnoActionPerformed

    private void botonSiguientePaginadorUnoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSiguientePaginadorUnoActionPerformed
        paginarAdelanteTablaObraSocial();
}//GEN-LAST:event_botonSiguientePaginadorUnoActionPerformed

    /**
     * Setea en cada componente del JDialog los eventos que capturarán la tecla
     * enter y escape.
     */
    private void setearEventosQueCapturanTeclaEnterYEscape() {
        //Declaración del evento a capturar
        KeyListener keyListenerEnter = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    if (esGuiVisualizacion) {
                        seleccionarObraSocial();
                    }
                }
            }
        };
        //Declaración del evento a capturar
        KeyListener keyListenerEscape = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    dispose();
                }
            }
        };
        //Setear eventos
        tablaObraSocial.addKeyListener(keyListenerEnter);
        tablaObraSocial.addKeyListener(keyListenerEscape);

        botonAnteriorPaginadorUno.addKeyListener(keyListenerEscape);
        botonSiguientePaginadorUno.addKeyListener(keyListenerEscape);

        filtrar.addKeyListener(keyListenerEscape);

        botonAgregarObraSocial.addKeyListener(keyListenerEscape);
    }
    
    /**
     * Inicia el/los paginadores activos en esta ventana
     */
    private void iniciarPaginador() {
        //Rango de filas para cada paginador
        int rangoFilas[] = new int[CapaLogica.PAGINADOR_PAGINADORES_SIMULTANEOS];

        //Rango de filas para el paginador 1
        rangoFilas[0] = 50;
        //Rango de filas para el paginador 2
        rangoFilas[1] = 10;
        //Rango de filas para el paginador 3
        rangoFilas[2] = 0;

        Paginador.inicializarPaginador(rangoFilas);
    }

    /**
     * Realiza la paginación hacia atrás.
     */
    private void paginarAtrasTablaObraSocial() {
        //Retrocede el los índices
        Paginador.atrasPaginador(0);
        Paginador.paginarElemento[0] = true;

        //Vuelve a buscar con los nuevos índices
        if (tablaObraSocial.getModel().getColumnCount() > 0) {
            cargarTablaObraSocial();
        }
    }

    /**
     * Realiza la paginación hacia adelante, teniendo en cuenta que existan elementos,
     * de lo contrario no procede a listarlos.
     */
    private void paginarAdelanteTablaObraSocial() {
        //Adelanta los índices
        Paginador.adelantePaginador(0);
        Paginador.paginarElemento[0] = true;

        //Vuelve a buscar con los nuevos índices
        if (tablaObraSocial.getModel().getColumnCount() > 0) {
            //Si no hay elementos siguientes se vuelven los índices hacia atras
            if (ObraSocialLogica.getVectorObraSocialEnBd() == null) {
                Paginador.atrasPaginador(0);
            }
            cargarTablaObraSocial();
        }
    }
    
    public static ObraSocial getObraSocialSeleccionada() {
        return obraSocialSeleccionada;
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonAgregarObraSocial;
    private javax.swing.JButton botonAnteriorPaginadorUno;
    private javax.swing.JButton botonSiguientePaginadorUno;
    private javax.swing.JTextField filtrar;
    private javax.swing.JPanel paginadorUno;
    private javax.swing.JTable tablaObraSocial;
    private javax.swing.JScrollPane tablaObraSocialScrollPanel;
    private javax.swing.JLabel textoDescriptivoVentana;
    private javax.swing.JLabel textoFiltrar;
    // End of variables declaration//GEN-END:variables
    private static ObraSocial obraSocialSeleccionada;
    private boolean esGuiVisualizacion;
}
